# -*- coding: utf-8 -*-
# 如果你的程序（包括注释）中包含中文，请加上上面这一行，用于指明编码（utf-8）。
# #号开头的行都是注释。

# 如何编辑本程序：
#     用任何文本编辑器均可编辑。

# 如何运行本程序：
#     在终端中，运行：python p802_vectorization.py
#
# 依赖模块：
#     numpy  (pip install numpy)
#


import numpy as np

# 用np.meshgrid()生成坐标（常用于绘图）。

points = np.arange(-5, 5, 0.01) # 1000 equally spaced points
xs, ys = np.meshgrid(points, points)
z = np.sqrt(xs ** 2 + ys ** 2)

import matplotlib.pyplot as plt
plt.imshow(z, cmap=plt.cm.gray)
plt.colorbar()
plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")
plt.show()


# 用np.where()进行选择：

xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])
# 根据cond元素的值从xarr或者yarr中选择相应的元素：
result = [(x if c else y) for x, y, c in zip(xarr, yarr, cond)]
# 用np.where更快、更便捷：
result = np.where(cond, xarr, yarr)

# 另一个例子：
arr = np.random.randn(4, 4)
np.where(arr > 0, 2, -2)
np.where(arr > 0, 2, arr) # set only positive values to 2


# 计算统计值

arr = np.random.randn(5, 4)
arr.mean()  # 或者：np.mean(arr)
arr.sum()
arr.mean(axis=1)
arr.std(axis=0)

# 按行或按列累计：
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr.cumsum(axis=0)   
arr.cumprod(axis=1)

# 布尔数组
arr = np.random.randn(100)
bools = arr > 0
# 统计True的个数：
bools.sum()
# 是否至少含有一个True？
bools.any()
# 是否全是True？
bools.all()


# 排序

arr = np.random.randn(5, 3)
arr.sort(axis=0)
arr.sort(axis=1)
# 如果不想改变原来的数组，则可以用np.sort(arr)

# 保存到文件、从文件中读取：
arr = np.random.randn(5, 3)
np.save('some_array', arr)
arr2 = np.load('some_array.npy')


# 线性代数

# 点积（矩阵相乘）
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
# 以下三种形式效果一样：
x.dot(y)
np.dot(x, y)
x @ y
# 注：* 用于逐项相乘，不是矩阵乘法。

# numpy 线性代数库
from numpy.linalg import inv, qr
X = np.random.randn(5, 5)
mat = X.T.dot(X)
mati = inv(mat)
mat.dot(mati)
q,r = qr(mat)

# 常用的线性代数函数：
#  diag, dot, trace, det, eig, inv, pinv, qr, svd, solve, lstsq









